"""
1.生成器和生成器函数
"""

"""生成器: 实质就是迭代器
3种方式获取生成器
1.通过生成器函数
2.通过各种推导式来实现生成器
3.通过数据的转换也可以获取生成器
"""

def func():
    print("aaa")
    yield "bbb" # 将return换成yield就是生成器, 我们再执行这个函数的时候. 就不再是函数的执行了, 而是获取这个生成器
gener = func() # 获取生成器
print(gener) # <generator object func at 0x00000000020E77C8>

# 生成器的本质是迭代器. 所以. 我们可以直接执行__next__()来执行生成器
ret = gener.__next__() # 这个时候函数才会执行, yield的作用和return一样, 也是返回数据
print(ret)

"""哪yield和return有什么区别呢?
yield是分段来执行⼀个函数
return直接停⽌执行函数

yield的作用
保存当前运行状态（断点），然后暂停执行，即将生成器（函数）挂起
将yield关键字后面表达式的值作为返回值返回，此时可以理解为起到了return的作用


"""

def func1():
    print("111")
    yield 222
    print("333")
    yield 444
gener = func1()
ret = gener.__next__()
print(ret)
ret = gener.__next__()
print(ret)


"""send和__next__区别?
1.send和next()都是让生成器向下走⼀次
2.send可以给上⼀个yield的位置传递值, 不能给最后⼀个yield发送值. 在第⼀次执行生成器代码的时候不能使⽤send()
"""
def eat():
 print("我吃什么啊")
 a = yield "馒头"
 print("a=",a)
 b = yield "大饼"
 print("b=",b)
 c = yield "韭菜盒子"
 print("c=",c)
 yield "GAME OVER"
gen = eat() # 获取生成器
ret1 = gen.__next__()
print(ret1)
ret2 = gen.send("胡辣汤")
print(ret2)
ret3 = gen.send("狗粮")
print(ret3)
ret4 = gen.send("猫粮")
print(ret4)




